#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2008, umat
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without 
# modification, are permitted provided that the following conditions are met:
#
# - Redistributions of source code must retain the above copyright notice, this 
# list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright notice, 
# this list of conditions and the following disclaimer in the documentation 
# and/or other materials provided with the distribution.
# - The names of the contributors may not be used to endorse or promote products 
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import urllib, re, sys
from sgmllib import SGMLParser
from string import *
import htmlentitydefs, re
import wikipedia

from lybo import *

class MetalArchivesUploader(LyricWikiUploader):

	def get_albums(self,artistid):
		"""
		Get the list of albums linked from the band page
		"""
		class AlbumLister(SGMLParser):
			def reset(self):                              
				SGMLParser.reset(self)
				self.urls = []

			def start_a(self, attrs):                     
				href = [v for k, v in attrs if k=='href']  
				if href and href[0].find("release.php?id=") > 0:
					self.urls.append("http://metal-archives.com/"+href[0])

		f = urllib.urlopen("http://metal-archives.com/band.php?id="+artistid)
		parser = AlbumLister()
		parser.feed(f.read())
		parser.close() 
		f.close()
		return parser.urls

	def get_songs_from_album(self,url):
		"""
		Get all lyric ids from the album page and generate relevant links
		"""
		class SongLister(SGMLParser):
			def reset(self):                              
				SGMLParser.reset(self)
				self.urls = []

			def start_a(self, attrs):                     
				href = [v for k, v in attrs if k=='href']  
				if href:
					m = re.match("javascript:openLyrics\((\d+)\)", href[0])
					if m:
						self.urls.append("http://metal-archives.com/viewlyrics.php?id="+m.group(1))

		f = urllib.urlopen(url)
		parser = SongLister()
		parser.feed(f.read())
		parser.close() 
		f.close()
		return parser.urls


	def get_song_list(self, artistid):
		songlist = []
		for albumurl in self.get_albums(artistid):
			songlist.extend(self.get_songs_from_album(albumurl))
		return songlist

	def get_song(self,url):
		f = urllib.urlopen(url)
		s = f.read()
		f.close()
		s = re.sub(r"(?si)\r", "", s)

		artist = "Unknown" ## We need to use forceArtist

		m = re.search("(?si)<h4>(.*?)</h4></center>(.*?)<center>", s)
		song = self.format_song(unicode(m.group(1), 'latin-1'))
		lyrics = self.clean_lyrics(unicode(m.group(2), 'latin-1'))


		return artist, song, lyrics

if __name__ == "__main__":
	retval = 0
	print "NOTICE: Artist is an ID not the name, you have to use forceArtist to set the proper name."
	ul = MetalArchivesUploader()
	ul.parse_arguments_and_upload()
